package com.hb.core.meta;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;
import java.util.Objects;

/**
 * @description: 自定义sql字段填充器
 * @projectName: zhb-frame-build
 * @author: zhouhaizhi
 * @createTime: 2021/8/23 11:42
 * @version:1.0
 */
public class CustomMetaDataHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        Object delFlag = getFieldValByName(getDeleteFlagFieldName(), metaObject);
        if (delFlag == null) {
            setFieldValByName(getDeleteFlagFieldName(), getDefaultDelFlagValue(), metaObject);
        }

        Object createTime = getFieldValByName(getCreateTimeFieldName(), metaObject);
        if (Objects.isNull(createTime)) {
            createTime = new Date();
            setFieldValByName(getCreateTimeFieldName(), createTime, metaObject);
        }

        Object createBy = getFieldValByName(getCreateByFieldName(), metaObject);
        if (Objects.isNull(createBy)) {
            //获取当前用户登录账户
            createBy = getClientId();
            setFieldValByName(getCreateByFieldName(), createBy, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName(getUpdateTimeFieldName(), new Date(), metaObject);

        Object updateTime = getFieldValByName(getUpdateTimeFieldName(), metaObject);
        if (Objects.isNull(updateTime)) {
            setFieldValByName(getUpdateTimeFieldName(), new Date(), metaObject);
        }

        Object updateBy = getFieldValByName(getUpdateByFieldName(), metaObject);
        if (Objects.isNull(updateBy)) {
            Object accountId = getClientId();
            setFieldValByName(getUpdateByFieldName(), accountId, metaObject);
        }
    }

    /*
        获取逻辑删除字段的名称（非数据库中字段名称）
     */
    private String getDeleteFlagFieldName() {
        return "delFlag";
    }

    /*
        获取逻辑删除字段的默认值
     */
    private Integer getDefaultDelFlagValue() {
        return 0;
    }

    /*
        获取创建时间字段的名称（非数据库中字段名称）
     */
    private String getCreateTimeFieldName() {
        return "createTime";
    }

    /*
        获取创建人字段的名称（非数据库中字段名称）
     */
    private String getCreateByFieldName() {
        return "createBy";
    }

    /*
        获取更新时间字段的名称（非数据库中字段名称）
     */
    private String getUpdateTimeFieldName() {
        return "updateTime";
    }

    /*
        获取更新人字段的名称（非数据库中字段名称）
     */
    private String getUpdateByFieldName() {
        return "updateBy";
    }

    private String getClientId() {
        return "";
    }

}
